import os
import requests
import time

from config import conf
from eval_lib.common.logger import get_logger

log = get_logger()


class AllureServer(object):

    def __init__(self, host=None, headers=None):
        self.headers = {"accept": "*/*"} if not headers else headers
        self.host = conf.allure_server if not host else host

    def push_allure_results(self, path, uuid):
        """
        将Allure测试结果上传到服务器。

        :param path: 存储Allure测试结果的目录路径。
        :param uuid: 上传结果的唯一标识符。
        :return: 如果上传成功，返回服务器返回的JSON响应；否则返回False。
        """
        # 检查是否配置了服务器地址，如果没有配置，则不执行上传操作
        if not self.host:
            log.warning("no allure server")
            return
        # 构建Allure报告ZIP文件的路径
        allure_file_zip = f"{path}/allure-report.zip"
        # 检查ZIP文件是否存在，如果不存在，则不执行上传操作
        if not os.path.exists(allure_file_zip):
            log.warning(f"allure zip: `{allure_file_zip}` not exists")
            return
        # 准备上传的文件，这里只上传Allure报告的ZIP文件
        files = {
            'allureReportArchive': (
                "allure-report.zip", open(allure_file_zip,
                                          'rb'), 'application/x-zip-compressed'
            )
        }
        # 获取当前时间戳，用于生成结果URL的唯一后缀
        current_timestamp = int(time.time())
        # 构建结果URL，包括服务器地址、API路径、UUID和时间戳
        result_url = self.host + "/api/report/" + uuid + "-" + str(
            current_timestamp
        )[-7:]
        try:
            # 发起POST请求，上传报告ZIP文件
            resp = requests.post(result_url, files=files, headers=self.headers)
            # 记录上传结果的响应文本
            log.info(resp.text)
            # 如果响应状态码为201，表示上传成功，返回服务器返回的JSON响应
            if resp.status_code == 201:
                return resp.json()
            # 如果响应状态码不是201，记录错误信息
            else:
                log.error(
                    f"Allure Server Unknown Error !!! {resp.status_code}"
                )
                log.error(resp.json())
        except Exception as e:
            # 如果上传过程中发生异常，记录异常信息
            log.error(f"upload allure file error: {e}")
            return False
